﻿using System;
using System.Configuration;
using System.Linq;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Utilidades;
using System.Text;
using System.IO;
using iTextSharp.text.pdf;
using System.Web;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores
{
    /// <summary> Clase que hace de presentador base para todas las vistas </summary>
    public class PresentadorBase
    {
        /// <summary> Metodo que llena un dropdownList con los valores definidos en el WebConfig </summary>
        /// <param name="dropDonwList">objeto a llenar</param>
        /// <param name="keyConfig">nombre del parametro del config</param>
        /// <param name="limpiar">si limpia los valores del control o no </param>
        /// <remarks>los valores en el web.config deben estar separados por ;</remarks>
        public void CargarListaSinValor(ListControl dropDonwList, string keyConfig, bool limpiar)
        {
            string[] datos = ConfigurationManager.AppSettings[keyConfig].Split(';');
            if (limpiar)
                dropDonwList.Items.Clear();

            foreach (var dato in datos)
            {
                dropDonwList.Items.Add(new ListItem(dato, dato));
            }

        }
        

        /// <summary> Metodo que llena un dropdownList con los valores definidos en el WebConfig </summary>
        /// <param name="dropDonwList">objeto a llenar</param>
        /// <param name="keyConfig">nombre del parametro del config</param>
        /// <param name="limpiar">si limpia los valores del control o no </param>
        /// <remarks>los parametros en el web.config deben estar separados por ; y los datos asi Nombre|valor</remarks>
        public void CargarListaConValor(ListControl dropDonwList, string keyConfig, bool limpiar)
        {
            string[] datos = ConfigurationManager.AppSettings[keyConfig].Split(';');
            if (limpiar)
                dropDonwList.Items.Clear();

            foreach (string[] info in datos.Select(dato => dato.Split('|')))
            {
                dropDonwList.Items.Add(new ListItem(info[0], info[1]));
            }
        }


        /// <summary> Devuelve un valor Long que especifica el número de intervalos de tiempo entre dos valores Date. </summary>
        /// <param name="interval">Obligatorio. Valor de enumeración DateInterval o expresión String que representa el intervalo de tiempo que se desea utilizar como unidad de diferencia entre Date1 y Date2.</param>
        /// <param name="date1">Obligatorio. Date. Primer valor de fecha u hora que se desea utilizar en el cálculo.</param>
        /// <param name="date2">Obligatorio. Date. Segundo valor de fecha u hora que se desea utilizar en el cálculo.</param>
        /// <returns></returns>
        public long DateDiff(DateInterval interval, DateTime date1, DateTime date2)
        {
            long rs = 0;
            TimeSpan diff = date2.Subtract(date1);
            switch (interval)
            {
                case DateInterval.Day:
                case DateInterval.DayOfYear:
                    rs = (long) diff.TotalDays;
                    break;
                case DateInterval.Hour:
                    rs = (long) diff.TotalHours;
                    break;
                case DateInterval.Minute:
                    rs = (long) diff.TotalMinutes;
                    break;
                case DateInterval.Month:
                    rs = (date2.Month - date1.Month) + (12*DateDiff(DateInterval.Year, date1, date2));
                    break;
                case DateInterval.Quarter:
                    rs = (long) Math.Ceiling(DateDiff(DateInterval.Month, date1, date2)/3.0);
                    break;
                case DateInterval.Second:
                    rs = (long) diff.TotalSeconds;
                    break;
                case DateInterval.Weekday:
                case DateInterval.WeekOfYear:
                    rs = (long) (diff.TotalDays/7);
                    break;
                case DateInterval.Year:
                    rs = date2.Year - date1.Year;
                    break;
            } //switch
            return rs;
        }


        /// <summary>  Metodo que crea el script para imprimir el archivo  </summary>
        /// <returns></returns>
        public string GetAutoPrintJs()
        {
            var script = new StringBuilder();
            script.Append("var pp = getPrintParams();");
            script.Append("pp.interactive= pp.constants.interactionLevel.full;");
            script.Append("print(pp);"); return script.ToString();
        }


        /// <summary> Metodo que imprime el archivo pdf </summary>
        public void StreamPdf(PdfWriter writer)
        {
            var outputStream = new MemoryStream();
            //Add the auto-print javascript
            writer.AddJavaScript(GetAutoPrintJs());
            var content = outputStream.ToArray();
            outputStream.Close();
            HttpContext.Current.Response.ContentType = "application/pdf";
            HttpContext.Current.Response.BinaryWrite(content);
            HttpContext.Current.Response.End();
            outputStream.Close();
            outputStream.Dispose();
        }
    }

}
